package cn.wit.testalgorithms;

/**
 * 38.报数 能使能实现其功能，但是程序会崩(之前是内存溢出)
 * 
 * @author 16604
 *
 */
public class DemoCountOff {
	public static void main(String[] args) {

		for (int i = 1; i <= 10; i++)
			System.out.println(countAndSay(i));
	}

	public static String countAndSay(int n) {
		StringBuilder s1 = new StringBuilder("11"); // 一个用来遍历
		StringBuilder s2 = new StringBuilder(); // 一个用来存放
		// StringBuilder s3 =new StringBuilder(); //开始所定义

		// 先把边界条件搞出来，方便点，最后再看能不能整合
		if (n == 1) {
			return "1";
		}
		
		while (true) {

			int count = 1; // 用来记录相同数字的数目

			// 每循环一次，n--
			n--;
			if (n <= 1)
				break; // 如果循环截至，跳出循环

			for (int i = 0; i < s1.length() - 1; i++) {
				if (s1.charAt(i) == s1.charAt(i + 1)) {
					count++; // 发现元素相同，则计数器加一

					// 如果是判断到终点元素相等
					if (i == s1.length() - 2) {
						s2.append(count);
						s2.append(s1.charAt(i));
						break; // 可以跳出当前循环呢
					}
				} else {// 如果不相等
					s2.append(count);
					s2.append(s1.charAt(i));
					// 如果是判断到终点元素相等
					if (i == s1.length() - 2) {

						// 这里继续分为两种情况，一种尾巴是11，一种是12，相同，不同
						if (s1.charAt(i) != s1.charAt(i + 1)) {
							count = 1;
						}
						s2.append(count);
						s2.append(s1.charAt(i + 1));
					}
					count = 1;// 不相等，计数器一定要置为1
				}
			}
			s1 = s2; // 进行下一次循环
			StringBuilder s3 = new StringBuilder();// 把s3换到这里，每次使用前new一下，就不再报错
			s2 = s3;// 清空s2；
		}
		return s1.toString().toLowerCase();
	}
}
